@ **************************************************************************
@ * *
@ * Written by flose *
@ * *
@ * A example to make a soft interrupt
@ * *
@ **************************************************************************
.text
.global _start
_start:

	@ 异常向量表
	B MAIN
	B .
	B SWI_HANDLER
	B .
	B .
	
MAIN:
	@ 初始化栈顶指针 注意！不同模式下的栈顶指针是不同的，下面的这个SP是SVC模式下的SP
	MOV SP, #0x40000020
	@ 切换USER模式
	MSR CPSR, #0x10
	@ USER模式代码
	MOV R1, #1
	MOV R2, #2
	@ 发生软件中断，切换到SVC模式 0x08
	SWI #1
	ADD R3, R2, R1
	B STOP
	
SWI_HANDLER:
	STMFD SP!, {R1-R2, LR}	@ PUSH 保护现场
	MOV R1, #10
	MOV R2, #20 
	SUB R3, R2, R1
	LDMFD SP!, {R1-R2, PC}^	@ 把LR压栈之后出栈到PC，然后将SPSR寄存器的数据搬移到CPSR，把状态切换回USER
	
STOP:
	B STOP
	
.end
